/*
 * @(#)MessengerAglet.java
 *
 * 03L7246 (c) Copyright IBM Corp. 1996, 1998
 *
 * The program is provided "as is" without any warranty express or
 * implied, including the warranty of non-infringement and the implied
 * warranties of merchantibility and fitness for a particular purpose.
 * IBM will not be liable for any damages suffered by you as a result
 * of using the Program. In no event will IBM be liable for any
 * special, indirect or consequential damages or lost profits even if
 * IBM has been advised of the possibility of their occurrence. IBM
 * will not be liable for any third party claims against you.
 */

package example.itinerary;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Vector;

import com.ibm.aglet.Aglet;
import com.ibm.aglet.AgletProxy;
import com.ibm.aglet.Message;
import com.ibm.aglet.system.Aglets;
import com.ibm.aglet.util.AddressChooser;
import com.ibm.agletx.util.MessengerItinerary;

/**
 * <tt>MessengerAglet</tt> illustrates how to use MessengerItinerary.
 * Remote stationary aglets are created afterwhich a messenger aglet
 * visits each one of them to send an asynchronous  local message.
 *
 * @version     1.00	$Date: 1999/10/27 05:16:39 $
 * @author	Yariv Aridor
 */
public class MessengerAglet extends Aglet {

    MessengerItinerary itinerary;
    Vector addresses = new Vector();

    public void onCreation(Object ini) {
    }

    public boolean handleMessage(Message msg) {
	if (msg.sameKind("dialog")) {
	    Frame f = new MessengerFrame(this);
	    f.pack();
	    f.setVisible(true);
	    return true;
	} 
	return false;
    }

    public void start() {
	try {
	    itinerary.clear();
	    createStationaryAglets(itinerary);
	    itinerary.startTrip();
	} catch (Exception ex) {
	    ex.printStackTrace();
	}
    }

    public void createStationaryAglets(MessengerItinerary itin) throws Exception {
		String addr = null;
		for (int i=0; i<addresses.size(); i++) {
	    	try { 
			AgletProxy p = Aglets.createAglet(addr=(String)addresses.elementAt(i),
						  null,
						  "examples.itinerary.StationaryAglet",
						  null);
			itin.addAglet(addr,p.getAgletID());
	    	} catch (Exception ex) {
	    	}
		}
    }
}


class MessengerFrame extends Frame implements WindowListener,ActionListener{
    MessengerAglet aglet;
    List list = new List(10, false);
    AddressChooser address = new AddressChooser(15);
    Choice choice = new Choice();
    
    MessengerFrame(MessengerAglet a) {
		aglet = a;
		
		addWindowListener(this);
		setLayout(new BorderLayout());
		add("Center", list);

		Panel p = new Panel();
		p.setLayout(new FlowLayout());
		p.add(address);
		p.add(choice);
		Button ad = new Button("Add");
		Button remove = new Button("Remove");
		ad.addActionListener(this);
		remove.addActionListener(this);
		p.add(ad);
		p.add(remove);
		add("North", p);

		p = new Panel();
		p.setLayout(new FlowLayout());
		Button start = new Button("Start!");
		start.addActionListener(this);
		p.add(start);
		add("South", p);

		choice.addItem("dispose");
		update();
    }
    
    /**
     * Handles the action event
     * @param ae the event to be handled
     */
	public void actionPerformed(ActionEvent ae){
		if("Start!".equals(ae.getActionCommand())){
			if (aglet.itinerary==null) {  
		    	aglet.itinerary = new MessengerItinerary(aglet,choice.getSelectedItem());
			}
			aglet.start();
	    }else if("Remove".equals(ae.getActionCommand())){
			int i = list.getSelectedIndex();
			if (i>=0) {
		    	aglet.addresses.removeElementAt(i);
		    	list.delItem(i);
			}
		}else if("Add".equals(ae.getActionCommand())){
			aglet.addresses.addElement(address.getAddress());
			update();
		}
			
	}
	/**
     * Handles the window event
     * @param we the event to be handled
     */
	
	public void windowClosing(WindowEvent we){
		dispose();
	}
	
	public void windowOpened(WindowEvent we){
	}
	
	public void windowIconified(WindowEvent we){
	}
	
	public void windowDeiconified(WindowEvent we){
	}
	
	public void windowClosed(WindowEvent we){
	}
	
	public void windowActivated(WindowEvent we){
	}
	
	public void windowDeactivated(WindowEvent we){
	}

/*
    public boolean handleEvent(Event ev) {
	if (ev.id == Event.WINDOW_DESTROY) {
	    dispose();
	    return true;
	}
	return super.handleEvent(ev);
    }

    public boolean action(Event ev, Object obj) {
	if (ev.target instanceof Button) {
	    Button b = (Button)ev.target;
	    String l = b.getLabel();
	    if ("Start!".equals(l)) {
			if (aglet.itinerary==null) {  
		    	aglet.itinerary = new MessengerItinerary(aglet,choice.getSelectedItem());
			}
			aglet.start();
	    } else if ("Remove".equals(l)) {
			int i = list.getSelectedIndex();
			if (i>=0) {
		    	aglet.removeURL(i);
		    	list.delItem(i);
			}
	    } else if ("Add".equals(l)){
			aglet.addURL(ac.getAddress());
			update();
	    }
	    return true;
	}
	return false;
    }
*/

    private void update() {
		list.removeAll();
		Vector addrs = aglet.addresses;
		int size = addrs.size();
		for(int i = 0; i< size; i++) {
	    	list.addItem((String)addrs.elementAt(i));
		}
    }
}






